package com.book.oauth.server.client.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.book.modules.core.entity.DataEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * Description：
 * @Author： leo.xiong
 * @CreateDate： 2019/8/13 16:29
 * @Email： leo.xiong@suyun360.com
 * Version：1.0
 */
@Data
@ToString
@TableName("oauth_client_details")
@EqualsAndHashCode(callSuper = true)
public class Client extends DataEntity<Client> implements Serializable {

    private static final long serialVersionUID = -180735142621365116L;
    /**
     * （必须的）第三方用户的id（可理解为账号）
     */
    @TableField(value = "client_id")
    private String clientId;
    /**
     * 可访问的资源集合
     */
    @TableField("resource_ids")
    private String resourceIds;
    /**
     * 第三方应用和授权服务器之间的安全凭证(可理解为密码)
     */
    @TableField("client_secret")
    private String clientSecret;
    /**
     * 指定客户端申请的权限范围,可选值包括read,write,trust;
     * 其实授权赋予第三方用户可以在资源服务器获取资源，
     * 第三方访问资源的一个权限，访问范围
     */
    @TableField("scope")
    private String scope;
    /**
     * 此客户端可以使用的授权类型，默认为空
     * 可选值包括authorization_code,password,refresh_token,implicit,client_credentials
     * 最常用的grant_type组合有:
     * "authorization_code,refresh_token"(针对通过浏览器访问的客户端);
     * "password,refresh_token"(针对移动设备的客户端)
     * authorization_code — 授权码模式(即先登录获取code,再获取token)
     * password — 密码模式(将用户名,密码传过去,直接获取token)
     * client_credentials — 客户端模式(无用户,用户向客户端注册,然后客户端以自己的名义向’服务端’获取资源)
     * implicit — 简化模式(在redirect_uri 的Hash传递token; Auth客户端运行在浏览器中,如JS,Flash)
     * refresh_token — 刷新access_token
     */
    @TableField("authorized_grant_types")
    private String authorizedGrantTypes;
    /**
     * 客户端的重定向URI
     */
    @TableField("web_server_redirect_uri")
    private String webServerRedirectUri;
    /**
     * 指定客户端所拥有的Spring Security的权限值。
     */
    @TableField("authorities")
    private String authorities;
    /**
     * 设定客户端的access_token的有效时间值(单位:秒),可选,
     * 若不设定值则使用默认的有效时间值(60 * 60 * 12, 12小时).
     */
    @TableField("access_token_validity")
    private Integer accessTokenValidity;
    /**
     * 设定客户端的refresh_token的有效时间值(单位:秒),可选,
     * 若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天).
     */
    @TableField("refresh_token_validity")
    private Integer refreshTokenValidity;
    /**
     * 设置用户是否自动Approval操作, 默认值为 false,
     * 可选值包括 true,false, read,write.
     * 该字段只适用于grant_type="authorization_code的情况,当用户登录成功后,
     * 若该值为true或支持的scope值,则会跳过用户Approve的页面, 直接授权.
     */
    @TableField("autoapprove")
    private String autoapprove;
    /**
     * 这是一个预留的字段,在Oauth的流程中没有实际的使用,可选,
     * 但若设置值,必须是JSON格式的数据
     */
    @TableField("additional_information")
    private String additionalInformation;
}
